Міністерство освіти та науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Звіт
з лабораторної роботи № 2
з курсу: « Проектування комп’ютерних засобів захисту»
на тему: “ Формування цифрового підпису згідно стандарту DSS”
Львів 2007
Мета роботи: реалізувати демонстраційну програму формування цифрового підпису вхідного повідомлення згідно стандарту DSS.
Теоретичні відомості
Відправник і отримувач електронного документа використовують при обчисленні великі цілі числа: і – прості числа, біт кожне ; – просте число довжиною 160 розрядів (дільник числа). Числа , , є відкритими і можуть бути спільними для всіх користувачів мережі.
Відправник вибирає випадкове ціле число (). Число – секретний ключ відправника для формування електронного цифрового підпису.
Наступним кроком відправник обчислює значення
.
Число – відкритий ключ для перевірки підпису відправника. Це число передається всім отримувачам документів.
Для того, щоб підписати документ , відправник хешує його в ціле хеш-значення :
,
після цього відправник генерує випадкове ціле число при умові, що , і обчислює число :
.
Обчисливши число відправник обчислює за допомогою секретного ключа ціле число :
.
Пара чисел і утворюють цифровий підпис
під документом .
Таким чином, підписане повідомлення складається з трьох чисел .
Отримувач підписаного повідомлення перевіряє виконання умов
,
і відкидає підпис, якщо хоча б одна з умов не виконується.
Потім отримувач обчислює значення
,
хеш-значення
і числа
Після цього отримувач за допомогою відкритого ключа обчислює значення
і перевіряє виконання умови
.
Якщо умова виконується, тоді підпис під документом визнається отримувачем як справжній.
Можна строго математично довести , що рівність буде виконуватися тоді і тільки тоді, коли підпис під документом отриманий за допомогою того секретного ключа , з якого був обчислений відкритий ключ . Таким чином, можна твердо переконатися , що відправник повідомлення володіє даним секретним ключом (не розкриваючи при цьому значення ключа ) і що відправник підписав даний документ .
Лістинг програми
int DSS_Setup()
{
FILE *fp;
big p,q,h,g,n,s,t;
miracl *mip=mirsys(100,0);
p=mirvar(0);
q=mirvar(0);
h=mirvar(0);
g=mirvar(0);
n=mirvar(0);
s=mirvar(0);
t=mirvar(0);
/* randomise */
/*
printf("Enter 9 digit random number seed = ");
scanf("%ld",&seed);
getchar();*/
seed=123456789;
irand(seed);
/* generate q */
forever
{
bigbits(QBITS,q);
nxprime(q,q);
if (logb2(q)>QBITS) continue;
break;
}
printf("q= ");
cotnum(q,stdout);
/* generate p */
expb2(PBITS,t);
decr(t,1,t);
premult(q,2,n);
divide(t,n,t);
expb2(PBITS-1,s);
decr(s,1,s);
divide(s,n,s);
forever
{
bigrand(t,p);
if (compare(p,s)<=0) continue;
premult(p,2,p);
multiply(p,q,p);
incr(p,1,p);
copy(p,n);
if (isprime(p)) break;
}
printf("p= ");
cotnum(p,stdout);
/* generate g */
do {
decr(p,1,t);
bigrand(t,h);
divide(t,q,t);
powmod(h,t,p,g);
} while (size(g)==1);
printf("g= ");
cotnum(g,stdout);
fp=fopen("common.dss","wt");
fprintf(fp,"%d\n",PBITS);
mip->IOBASE=16;
cotnum(p,fp);
cotnum(q,fp);
cotnum(g,fp);
fclose(fp);
/*clrscr();
ShowMenu();*/
return 0;
}
int DSS_GenerateKeys()
{
FILE *fp;
big p,q,g,x,y;
long seed;
int bits;
miracl *mip;
/* get common data */
fp=fopen("common.dss","rt");
if (fp==NULL)
{
printf("file common.dss does not exist\n");
return 0;
}
fscanf(fp,"%d\n",&bits);
mip=mirsys(bits/4,16); /* use Hex internally */
p=mirvar(0);
q=mirvar(0);
g=mirvar(0);
x=mirvar(0);
y=mi...